/*
 * @Description: ESP8266作为STATION模式 <.c源文件>
 * @Autor: 唐京伟
 * @LastEditTime:2022年5月13日 21点31分
 */
#include "esp8266_STA.h"

// STA模式
unsigned char WIFI_NAME[] = "wei_wifi";
unsigned char WIFI_MI[] = "12345678";
unsigned char IP[] = "192.168.0.10";
unsigned char PORT[] = "8888";

unsigned char client[100]={0};	//用来拼接WIFI NAME、MI
unsigned char connect[100]={0};	//用来拼接IP PORT


uint8_t rxBuffer = 0;								 //接收一个字符，交给缓冲区
uint16_t rxCount = 0;  //计数器
char rxBuff[rx_rxBUFF_SIZE] = {0};   //缓冲区

/* 
	config_success说明：
	配置完成后置1，
	在中断中用来区别esp发给MCU的数据
	是状态OK(ERROR)数据还是命令数据 
*/
char config_success = 0;

uint8_t wifi_config_STA(void)
{
	memset(client,0,50);
	memset(connect,0,50);

	//拼接
	sprintf((char*)client,"AT+CWJAP=\"%s\",\"%s\"\r\n",WIFI_NAME,WIFI_MI);
	sprintf((char*)connect,"AT+CIPSTART=\"TCP\",\"%s\",%s\r\n",IP,PORT);
	
	//1、硬件复位
	if(wifi_reset(50))
	{
		usart1_printf("ESP 硬件复位失败!!\r\n");
		return 1;	
	}
	else
	{
		usart1_printf("ESP 硬件复位成功!!\r\n");
	}

	//2、AT+CWMODE=1 设置为STATION模式
	usart1_printf("(1) <STA>ESP模式配置中\r\n");
	if(wifi_sendCmd("AT+CWMODE=1\r\n",50))
	{
		usart1_printf("模式<STATION>配置失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("模式<STATION>配置成功!!\r\n");
	}
	
	//3、软件 AT+RST 复位
	usart1_printf("(2) <RST>复位配置中\r\n");
	if(wifi_sendCmd("AT+RST\r\n",50))
	{
		usart1_printf("<RST>复位配置失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("<RST>复位配置成功!!\r\n");
	}
	
	delay_ms(300);
	
	//4、AT+CWJAP
	usart1_printf("(3) <CWJAP>连接wifi中\r\n");
	usart1_printf("---------------------------------------\r\n");
	usart1_printf("正在连接的wifi名称为：%s\r\n",WIFI_NAME);
	usart1_printf("正在连接的wifi密码为：%s\r\n",WIFI_MI);
	usart1_printf("---------------------------------------\r\n");
	if(wifi_sendCmd((char*)client,500))
	{
		usart1_printf("wifi连接失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("wifi连接成功!!\r\n");
	}
	
	//5、AT+CIPMUX=0
	usart1_printf("(4) <CIPMUX=0>正在设置多连接\r\n");
	if(wifi_sendCmd("AT+CIPMUX=0\r\n",50))
	{
		usart1_printf("<CIPMUX=0>设置失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("<CIPMUX=0>设置成功!!\r\n");
	}
	
	//6、AT+CIPMODE=1
	usart1_printf("(5) <CIPMODE=1>正在配置传输模式\r\n");
	if(wifi_sendCmd("AT+CIPMODE=1\r\n",50))
	{
		usart1_printf("<CIPMODE=1>配置失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("<CIPMODE=1>配置成功!!\r\n");
	}
	
	//7、AT+CIPSTART
	usart1_printf("(6) <CIPSTART>TCP连接建立中\r\n");
	usart1_printf("---------------------------------------\r\n");
	usart1_printf("TCP连接的IP和端口为：%s / %s\r\n",IP,PORT);
	usart1_printf("---------------------------------------\r\n");
	if(wifi_sendCmd((char*)connect,50))
	{
		usart1_printf("TCP建立失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("TCP建立成功!!\r\n");
	}
	
	//8、AT+CIPSEND
	usart1_printf("(7) <CIPSEND>建立数据传输中\r\n");
	if(wifi_sendCmd("AT+CIPSEND\r\n",50))
	{
		usart1_printf("<CIPSEND>建立数据传输失败\n重启\r\n");
		return 1;
	}
	else
	{
		usart1_printf("<CIPSEND>建立数据传输成功\n可以发送数据了!!\r\n");
		config_success = 1;	//配置成功 置位config_success
	}
	return 0;
}

/**
 * @author: 唐京伟
 * @description: wifi复位，使某些配置生效，不需要掉电重启
 * @param: timeout 等待超时时间
 * @return: 0-复位成功 1-复位失败
 */
uint8_t wifi_reset(int timeout)
{
	GPIO_ResetBits(WIFI_RESET_GPIO_Port, WIFI_RESET_Pin);
	delay_ms(500);
	GPIO_SetBits(WIFI_RESET_GPIO_Port, WIFI_RESET_Pin);
	while(timeout--)
	{
		delay_ms(100);
		if(strstr(rxBuff,"ready"))
			break;
		usart1_printf("%d ",timeout);
	}
	usart1_printf("\r\n");
	if(timeout<=0) return 1;
	else return 0;
}

/**
 * @author: 唐京伟
 * @description: wifi通过wifiUsart发送数据
 * @param: timeout 等待超时时间
 * @return: 0-复位成功 1-复位失败
 */
void wifi_sendMessage(char *cmd)
{
	usart2_printf(cmd);
	// HAL_UART_Transmit(&wifiUsart,(unsigned char*)cmd,strlen(cmd),1000);
}

/**
 * @author: 唐京伟
 * @description: wifi通过wifiUsart发送指令
 * @param: timeout 等待超时时间
 * @return: 0-复位成功 1-复位失败
 */
uint8_t wifi_sendCmd(char *cmd,int timeout)
{
	unsigned char send_cmd[rx_rxBUFF_SIZE] = {0};
	rxCount = 0;
	memset(send_cmd,0,rx_rxBUFF_SIZE);
	sprintf((char*)send_cmd,"%s\r\n",cmd);
	while(1) 
	{	
		usart2_printf(send_cmd);
		if (1)
		{
			while(timeout--)
			{
				delay_ms(100);
				if(strstr(rxBuff,"OK"))  //在字符串 haystack 中查找第一次出现字符串 needle 的位置
					break;
				usart1_printf("%d ",timeout);
			}
			usart1_printf("\r\n");
			if(timeout<=0) return 1;
			else return 0;
		}
	}
}

